package cn.javano.guava.learn;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.Sets;

/**
 * 集合[Collections]
 * 
 * @author lengleng
 * @date 2017年1月1日
 */
public class LearnCollections {
	/**
	 * 可变集合的种类List
	 */
	@Test
	public void testImmutableList() {
		ImmutableList<String> userList = ImmutableList.of("Tom", "Jack",
				"LiHua", "XiaoMing");
		// copy
		ImmutableList<String> userList2 = ImmutableList.copyOf(userList);
		// 不能操作 抛出异常
		userList2.add("Love");
	}

	/**
	 * 不重复 排序Set
	 */
	@Test
	public void testImmutableSortedSet() {
		ImmutableSortedSet<String> sortedSet = ImmutableSortedSet.of("a", "c",
				"b", "d", "a");
		System.out.println(sortedSet);
	}

	/**
	 * asList返回的列表视图通常比一般的列表平均性能更好 在底层集合支持的情况下，它总是使用高效的contains方法。
	 */
	@Test
	public void testAsList() {
		ImmutableSortedSet<String> sortedSet = ImmutableSortedSet.of("a", "c",
				"b", "d", "a");
		ImmutableList<String> immutableList = sortedSet.asList();
		System.out.println(immutableList);
	}

	/**
	 * Multiset Collection
	 */
	@Test
	public void testMultiset() {
		String strWorld = "wer|dfd|dd|dfd|dda|de|dr";
		String[] words = strWorld.split("\\|");
		List<String> wordList = new ArrayList<String>();
		for (String word : words) {
			wordList.add(word);
		}
		Multiset<String> multiset = HashMultiset.create();
		multiset.addAll(wordList);
		// System.out.println(multiset.contains("dd"));
		System.out.println(multiset.elementSet());
	}

	/**
	 * Multimap (不存在NULL)，支持 key -》 多个值，复杂数据结构可以用  。。。
	 */
	@Test
	public void testMultimap() {
		Multimap<String, String> multimap = HashMultimap.create();
		multimap.put("tom", "99");
		multimap.put("tom", "98");
		multimap.put("tom", "97");
		multimap.put("tom", "96");
		multimap.put("tom", "95");

		// System.out.println(multimap);
		Map<String, Collection<String>> map = multimap.asMap();
		System.out.println(map);
	}

	/**
	 * Lists 工具类
	 */
	@Test
	public void testLists() {
		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("2");
		list.add("3");
		list.add("4");
		System.out.println(Lists.reverse(list));
	}

	/**
	 * Sets工具类
	 */
	@Test
	public void testSets() {
		Set<String> animals = ImmutableSet.of("gerbil", "hamster");
		Set<String> fruits = ImmutableSet.of("apple", "orange", "banana");
		// 返回所有集合的笛卡儿积
		Set<List<String>> cartesianProduct = Sets.cartesianProduct(animals,
				fruits);
		System.out.println(cartesianProduct);
		// 返回所有子集
		Set<Set<String>> powerSet = Sets.powerSet(animals);
		System.out.println(powerSet);

	}
}
